本來 PHP 支援兩類 regular expression, 一種為 POSIX-style 相關函數名稱包含 ereg, 一種為 Perl-style 相關函數名稱包含 preg, 自 PHP 5.3 後 POSIX-style 相關函數就棄用了, 現在主要用 Perl-style 相關函數, 這些函數的模式語法與 perl 相當類似, 表達式用分隔符包起來, 例如分隔符使用 "/", 分隔符可以用非字母、非數字、非空白、非""以外的字符表示, 結束分隔符後面是模式修飾符(Pattern Modifiers), 常見模式修飾符有, i 表大小寫不敏感, m 目標字串視為多行
/*
Meta-characters(元字符)
\ 轉義字符
^ 開始位置
$ 結束位置
. 除換行外符外的任何字符
[ 開始字符類定義
] 結束字符類定義
| 可選分支
( 開始子模式
) 結束子模式
? 量詞, 表 0 次或 1 次, 位於量詞後用於改變量詞的貪婪性
* 量詞, 0 或 多次
+ 量詞, 1 或 多次
{ 自定義量詞開始標記
} 自定義量詞結束標記
Meta-characters 在方括號裡面
\ 轉義字符
^ 僅在作為第一個字符, 表明字符類取反
- 標記字符範圍
*/
$pattern = '/[a,b]/'; // 匹配 a b 兩種字符
$pattern = "/[0-9]/"; // 匹配數字0-9
$pattern = "/^cat/"; // 匹配 cat 當開頭
/*
preg_match(
string $pattern, 要匹配的模式
string $subject, 輸入字串
array &$matches = null, 如果提供這個參數, 會被填充為匹配結果,
$matches[0] 完整模式匹配到的內容, $matches[1] 子模式匹配到的內容
int $flags = 0, 唯一標記值, 可設為 PREG_OFFSET_CAPTURE, PREG_UNMATCHED_AS_NULL,
int $offset = 0 指定目標字串某個位置開始匹配
): int|false
*/
$str = 'abcdef';
$pattern = '/cd/';
var_dump(preg_match($pattern, $str, $match));
var_dump($match);